package cz.pecinovsky.česky.oopnz._125_;
//Příliš žluťoučký kůň úpěl ďábelské ódy

import cz.pecinovsky.česky.oopnz.správce.IKreslený;
import cz.pecinovsky.česky.oopnz.správce.Kreslítko;
import cz.pecinovsky.česky.oopnz.správce.Obdélník;
import cz.pecinovsky.česky.oopnz.správce.SprávcePlátna;


////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++
//%I+ =133c
//
//import správce.*;
//%I-
//%I+ >=133z
//
//import cz.pecinovsky.česky.oopnz.správceplátna.IKreslený;
//import cz.pecinovsky.česky.oopnz.správceplátna.Kreslítko;
//import cz.pecinovsky.česky.oopnz.správceplátna.Obdélník;
//import cz.pecinovsky.česky.oopnz.správceplátna.SprávcePlátna;
//%I-
//%A+ >=133z

import cz.pecinovsky.česky.oopnz.utility.Barva;
import cz.pecinovsky.česky.oopnz.utility.IO;
//%A-
//%X+ xxxxx Začátek přeskakovaného textu xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class Město_128_133
{    private Město_128_133() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- Konec přeskakovaného textu -----


/*******************************************************************************
 * Instance třídy {@code Město} je jedináček a představuje město,
 * do kterého budou postupně umísťovány různé objekty.
 * Město může být větší než aktuální plátno a umístí se vždy tak,
 * aby ve středu plátna bylo aktuální políčko, které lze nastavit.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class Město implements IKreslený
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Výchozí počet sloupců. */
    private static final int SLOUPCŮ_0 = 10;

    /** Výchozí počet řádků. */
    private static final int ŘÁDKŮ_0 = 10;

    /** Správce plátna, v němž se město vyskytuje. */
    private static final SprávcePlátna SP = SprávcePlátna.getInstance();

    /** Jediná přípustná instance města. */
    private static final Město jedináček = new Město(SLOUPCŮ_0, ŘÁDKŮ_0);



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Aktuální velikost kroku správce plátna. */
    private int modul = SP.getKrok();

    /** Obdélník zobrazující plochu města. */
    private Obdélník podklad;

    /** Obdélník zobrazující plochu města. */
    private Obdélník aktivní;

    /** Aktuální počet sloupců města. */
    private int sloupců;

    /** Aktuální počet řádků města. */
    private int řádků;

    /** Sloupec políčka, které se bude zobrazovat. */
    private int aktSloupec;

    /** Řádek políčka, které se bude zobrazovat. */
    private int aktŘádek;



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vrátí (jedinou existující) instanci města.
     *
     * @return Požadovaná instance
     */
    public static Město getInstance()
    {
        return jedináček;
    }


    /***************************************************************************
     * Vytvoří nové město se zadaným počtem sloupců a řádků.
     * Prozatím se nepočítá, že by se rozměr města v průběhu jeho života měnil.
     *
     * @param sloupců   Počet sloupců vytvářeného města
     * @param řádků     Počet řádků vytvářeného města
     */
    private Město(int sloupců, int řádků)
    {
        this.sloupců = sloupců;
        this.řádků   = řádků;

        aktSloupec = this.sloupců / 2;
        aktŘádek   = this.řádků / 2;

        podklad = new Obdélník(0, 0, 1, 1, Barva.KOUŘOVÁ);
        aktivní = new Obdélník(0, 0, 1, 1, Barva.MLÉČNÁ);

        SP.přidej(this);
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Přestěhuje aktivní pole do jiné pozice města
     * a tím automaticky přesune město na plátně tak,
     * aby bylo aktivní pole opět uprostřed plátna.
     * Prozatím nekontroluje, zda pole vůbec zůstane po přesunu ve městě.
     *
     * @param sloupec Nový sloupec aktivního pole
     * @param řádek   Nový řádek aktivního pole
     */
    public void aktivníNa(int sloupec, int řádek)
    {
        aktSloupec = sloupec;
        aktŘádek   = řádek;
        SP.překresli();
    }


    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param kreslítko Kreslítko, které nakreslí instanci
     */
    @Override
    public void nakresli(Kreslítko kreslítko)
    {
        modul = SP.getKrok();
        int sloupcůPlátna = SP.getSloupců();
        int řádkůPlátna   = SP.getŘádků();

        //Aktuálníh políčko města musí být uprostřed plátna
        int apSloupec = sloupcůPlátna / 2;
        int apŘádek   = řádkůPlátna   / 2;

        //Pozice podkladu města se musí nastavit tak,
        //aby aktuální políčko bylo na plátně ve spočtené pozici
        int xMěsta = (apSloupec - aktSloupec) * modul;
        int yMěsta = (apŘádek   - aktŘádek  ) * modul;
        podklad.setPozice(xMěsta, yMěsta);
        podklad.setRozměr(sloupců*modul, řádků*modul);

        podklad.nakresli(kreslítko);

        aktivní.setPozice((2*apSloupec - 1) * modul / 2,
                          (2*apŘádek   - 1) * modul / 2);
        aktivní.setRozměr (2*modul);
        aktivní.nakresli(kreslítko);
    }


//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Město inst = new Město();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}

//%%-  ----- Začátek ignorovaného závěrečného textu -----
////////////////////////////////////////////////////////////////////////////////
//%X+ <xxx
//%X-
//%I+ <xxx
//%I-
//== TESTY A METODA MAIN =======================================================

    /***************************************************************************
     * Testovací metoda.
     */
    public static void test()
    {
        final int ms = 500;
        SprávcePlátna SP = SprávcePlátna.getInstance();
        Město město = Město.getInstance();  IO.zpráva("Nové");
        SP.setKrokRozměr(20, 12, 12);
        IO.zpráva("SP-20-12-12");
        město.aktivníNa(0, 0);
        IO.zpráva("m.akt(0,0)");
        město.aktivníNa(8, 8);              IO.zpráva("m.akt(8,8)");
        System.exit(0);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {  test();  }
}
